package reflect;

import java.io.File;
import java.lang.reflect.Method;

/**
 * 调用与当前类Test2所在同一个包中所有类的以"s"开头的无参方法.
 */
public class Test2 {
    public static void main(String[] args) throws Exception {
        /*
            提示:
                Method类有一个方法:
                int getParameterCount()
                可以获取其表示的方法的参数个数
         */

        //扫描与当前类Test2所在同一个包中所有的类
        File dir = new File(
                Test2.class.getResource(".").toURI()
        );
        String packName = Test2.class.getPackage().getName();
        //获取同包中所有的字节码文件
        File[] subs = dir.listFiles(f->f.getName().endsWith(".class"));
        //遍历每一个字节码文件
        for(File sub : subs){
            //获取文件名
            String fileName = sub.getName();//例如:Person.class
            //根据字节码文件名获取对应的类名
            String className = fileName.substring(0,fileName.indexOf("."));
            //加载这个类的类对象
            Class cls = Class.forName(packName+"."+className);
            Object o = cls.newInstance();//实例化
            //获取该类定义的所有方法
            Method[] methods = cls.getDeclaredMethods();
            //遍历该类定义的每一个方法
            for(Method m : methods){
                //判断该方法的方法名是否以"s"开头
                String methodName = m.getName();
                if(methodName.startsWith("s")//判断方法名以"s"开始
                        &&
                   m.getParameterCount()==0//判断是否为无参方法
                ){
                    m.invoke(o);
                }
            }



        }


    }
}
